package com.stefan.bitmap;


/*
* 方式一： 数组是byte数组可以表示8bit（位）01表示法
* 先要确定数组的length，则是max/8+1, 假如max是80，则byte数组的length就是11
* 此时想一下，如果用int数组表示，那数组的长度是不是80
*
* */
public class StefanBitMap {
    byte[] elements;
    int max;
    public StefanBitMap(int max) {
        this.max = max;
        elements = new byte[(max >> 3)+1];
    }
    public void add (int n) {
        //找到该数n在byte[]的下标
        int index = n >> 3;
        //然后从这8位表示法里面找到position
        //int position = n%8; //或者用 n & (8-1) - 这个是不是hashmap里面的？
        int position = n & 7;
        //接下来就是要把elements[index]里面的position位置变成1,怎么来玩？
        //利用或运算设置成1，假如position算出来的是6, 那你把1像左移动6位，是不是第七位就是1，与原来的做或运算，那第七位就一定是1
        //position是6是不是在第七位？
        //为什么不能 elements[index] = 1 << position  ？？这个是赋值，而不是位的表示法。
        elements[index] |= 1 << position;
    }
    public boolean find (int n) {
        int index = (n >> 3);
        int position = n%8;
        int flag = elements[index] & (1 << position);
        if (flag == 0) return false;
        return true;
    }

    public static void main(String[] args) {
        StefanBitMap stefanBitMap = new StefanBitMap(100);
        stefanBitMap.add(10);
        stefanBitMap.add(99);
        stefanBitMap.add(18);
        stefanBitMap.add(20);
        System.out.println(stefanBitMap.find(99));
        System.out.println(stefanBitMap.find(13));
        System.out.println(stefanBitMap.find(40));
        System.out.println(stefanBitMap.find(20));
    }
}
